\chapter{比特币(Bitcoin) \& 区块链(Block Chains)}
\section{比特币起源}\footnote{此节文字来源于 \url{https://baike.baidu.com/item/中本聪}}
2008年11月1日(也有称准确的时间是2008年10月31日)，Satoshi Nakamoto(中文翻译为“中本聪”)在“metzdowd.com”网站的密码学邮件列表中发表了一篇论文，题为《Bitcoin：A Peer-to-Peer Electronic Cash System》（中文翻译为《比特币：一种点对点式的电子现金系统》）\footnote{此文章的网页版\url{https://nakamotoinstitute.org/bitcoin/}，此网页上也有此文章的中文链接。}。论文中详细描述了如何创建一套去中心化的电子交易体系，且这种体系不需要创建在交易双方相互信任的基础之上。很快，2009年1月3日，他开发出首个实现了比特币算法的客户端程序并进行了首次“采矿”（mining），获得了第一批的50个比特币。这也标志着比特币金融体系的正式诞生。\cite{baidu-bitcoin} \par
2010年12月5日，在维基解密泄露美国外交电报事件期间，比特币社区呼吁维基解密接受比特币捐款以打破金融封锁。中本表示坚决反对，认为比特币还在摇篮中，经不起冲突和争议。七天后的12月12日，他在比特币论坛中发表了最后一篇文章，提及了最新版本软件中的一些小问题，随后不再露面，电子邮件通讯也逐渐终止。\par
从发表论文以来，中本聪的真实身份长期不为外界所知，维基解密创始人朱利安·阿桑奇（Julian Assange）宣称中本聪是一位密码朋克（Cypherpunk）。另外，有人称“中本聪是一名无政府主义者，他的初衷并不希望数字加密货币被某国政府或中央银行控制，而是希望其成为全球自由流动、不受政府监管和控制的货币。”
\section{技术发展脉络}
ACM Queue在2017年发表了一篇文章“Bitcoin’s Academic Pedigree
”\footnote{ACM Queue文章不需付费，此文章下载地址为\url{https://queue.acm.org/detail.cfm?id=3136559}，在网上有这篇文章的中文译稿，大家可以参考阅读，地址为\url{https://blog.csdn.net/tangxiaoyin/article/details/80131400}}，此文章对比特币的技术发展脉络进行了梳理(\ref{bitcoin-chronology})。
并按一下组织方式进行了基本概念的说明：
\begin{enumerate}
	\item ledger(账本)
	\begin{enumerate}
		\item Linked timesstamping(时间戳链)
		\item Merkle trees(默克尔树)
		\item Byzantine fault tolerance(拜占庭容错)
	\end{enumerate}
	\item Proof of work(工作量证明)
	\begin{enumerate}
		\item The origins(概念起源)
		\item hahscash(哈希现金)
		\item proof of work and digital cash:A catch-22(工作量证明和数字现金：左右为难)
	\end{enumerate}
	\item putting it all together(集成)
	\begin{enumerate}
		\item public keys as identities(公钥作为身份)
	\end{enumerate}
\end{enumerate}

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{chronology-bitcoin.png}
	\caption{比特币技术发展脉络}
	\label{bitcoin-chronology}
\end{figure}

\subsection{账本}
账本记录了比特币的交易，比特币系统是一个去中心化电子货币系统，所以每个人都有一个账本的拷贝，账本是一个区块链(block chain)。

\subsection{交易(Transaction)}
在比特币系统中，电子货币(electronic coin)是一个签名链(a chain of digital signatures)，每一位货币所有者，通过对“前一次交易和下一位拥有者公钥”哈希值进行数字签名，并且把这个签名附加在电子货币尾端，完成货币的转移。收款人通过验证签名就能够验证该链条的所有者。表示电子货币的签名链如图\ref{bitcoin-tansaction}所示。
\par
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{bitcoin-transaction.png}
	\caption{电子币的签名链}
	\label{bitcoin-tansaction}
\end{figure}


\subsection{拜占庭协议}
由于比特币是一个去中心化的系统，但是账本信息又要保持一致，这其实是个不很容易实现的问题，这是分布式系统里面的一个经典问题，同步问题或者共识问题。\par

这个问题通常用"拜占庭将军问题"来形象表述。

\subsubsection{拜占庭将军问题(The Byzantine Generals Problem)}
		
拜占庭将军问题（The Byzantine Generals Problem），是由LESLIE LAMPORT, ROBERT SHOSTAK和 MARSHALL PEASE在1982年的ACM Transactions on Programming Languages and Systems上发表的文章“The Byzantine Generals Problem”中提出的，文章中称“可靠的计算机系统必须能够应对一个或多个故障组件，失败的组件可能会向不同的部分发送冲突信息，系统应对这个问题抽象地描述为拜占庭将军问题。”,当然这个故事是虚构出来的。\par
我们看看网络上一个帖子\footnote{一文读懂拜占庭将军问题,链接\url{https://www.cnblogs.com/aspirant/p/13321816.html}}基于原论文对此问题的描述。\par
\vspace{1cm}
\textit{拜占庭帝国(Byzantine Empire)军队的几个师驻扎在敌城外，每个师都由各自的将军指挥。将军们只能通过信使相互沟通。在观察敌情之后，他们必须制定一个共同的行动计划，如进攻(Attack)或者撤退(Retreat)，且只有当半数以上的将军共同发起进攻时才能取得胜利。然而, 其中一些将军可能是叛徒，试图阻止忠诚的将军达成一致的行动计划。 更糟糕的是，负责消息传递的信使也可能是叛徒，他们可能篡改或伪造消息，也可能使得消息丢失。}\par
\textit{为了更加深入的理解拜占庭将军问题，我们以三将军问题为例进行说明。}\par
\textit{当三个将军都忠诚时，可以通过投票确定一致的行动方案，图\ref{Byzantine-Honest}展示了此种场景， 即General A，B通过观察敌军军情并结合自身情况判断可以发起攻击，而General C通过观察敌军军情并结合自身情况判断应当撤退。 最终三个将军经过投票表决得到结果为进攻：撤退=2:1， 所以将一同发起进攻取得胜利。对于三个将军，每个将军都能执行两种决策(进攻或撤退)的情况下, 共存在6中不同的场景，图\ref{Byzantine-Honest}展示的是其中一种，对于其他5中场景可简单地推得，通过投票三个将军都将达成一致的行动计划。}\par
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{Byzantine-Honest.jpeg}
	\caption{三个将军都忠诚的情况}
	\label{Byzantine-Honest}
\end{figure}
\par

\textit{当三个将军中存在一个叛徒时，将可能扰乱正常的作战计划。图\ref{Byzantine-2Honest}展示了General C为叛徒的一种场景，他给General A和General B发送了不同的消息，在这种场景下General A通过投票最终得出撤退的结论；General B通过投票最终得出进攻的结论。General C是叛将，他不会根据投票结果行事，他会根据是否对己方有力，做出进攻或撤退的决断，比如C撤退，结果只有General B发起了进攻并战败。}\par
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{Byzantine-2Honest.jpeg}
	\caption{三个将军中两个忠诚，一个叛将的情况}
	\label{Byzantine-2Honest}
\end{figure}
\par
\textit{事实上，对于三个将军中存在一个叛徒的场景，想要总能达到一致的行动方案是不可能的。详细的证明可参看Leslie Lamport的论文。此外，论文中给出了一个更加普适的结论：如果存在m个叛将，那么至少需要3m+1个将军，才能最终达到一致的行动方案。}\par
\textit{Leslie Lamport在论文中给出了两种拜占庭将军问题的解决方案，即口信消息型解决方案(A solution with oral message)和签名消息型解决方案(A solution with signed message)。}\par
\vspace{0.5cm}
\textit{1、口信消息型解决方案}\par
\textit{首先, 对于口信消息(Oral message)的定义如下}：\par
\textit{A1. 任何已经发送的消息都将被正确传达;}\par
\textit{A2. 消息的接收者知道是谁发送了消息;}\par
\textit{A3. 消息的缺席可以被检测。}\par
\textit{基于口信消息的定义，我们可以知，口信消息不能被篡改但是可以被伪造。基于对图\ref{Byzantine-2Honest}场景的推导，我们知道存在一个叛将时，必须再增加3个忠将才能达到最终的行动一致。为加深理解，我们将利用3个忠将1个叛将的场景对口信消息型解决方案进行推导。在口信消息型解决方案中，首先发送消息的将军称为指挥官，其余将军称为副官。对于3忠1叛的场景需要进行两轮作战信息协商，如果没有收到作战信息那么默认撤退。图\ref{Byzantine-Commonder-Honest}是指挥官为忠将的场景，在第一轮作战信息协商中，指挥官向3位副官发送了进攻的消息；在第二轮中，三位副官再次进行作战信息协商，由于General A、B为忠将，因此他们根据指挥官的消息向另外两位副官发送了进攻的消息，而General C为叛将，为了扰乱作战计划，他向另外两位副官发送了撤退的消息。最终Commanding General, General A和B达成了一致的进攻计划，可以取得胜利。}\par

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{Byzantine-Commonder-Honest.jpeg}
	\caption{指挥官为忠将的情况}
	\label{Byzantine-Commonder-Honest}
\end{figure}
\par
\textit{图\ref{Byzantine-Commonder-disHonest}是指挥官为叛将的场景，在第一轮作战信息协商中，指挥官向General A、B发送了撤退的消息，但是为了扰乱General C的决定向其发送了进攻的消息。在第二轮中，由于所有副官均为忠将，因此都将来自指挥官的消息正确地发送给其余两位副官。最终所有忠将都能达成一致撤退的计划。}\par

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{Byzantine-Commonder-disHonest.jpeg}
	\caption{指挥官为忠将的情况}
	\label{Byzantine-Commonder-disHonest}
\end{figure}
\par
\textit{如上所述，对于口信消息型拜占庭将军问题，如果叛将人数为m，将军人数不少于3m+1，那么最终能达成一致的行动计划。值的注意的是，在这个算法中，叛将人数m是已知的，且叛将人数m决定了递归的次数，即叛将数m决定了进行作战信息协商的轮数，如果存在m个叛将，则需要进行m+1轮作战信息协商。这也是上述存在1个叛将时需要进行两轮作战信息协商的原因。}\par

\vspace{0.5cm}
\textit{2、签名消息型解决方案}\par

\textit{同样，对签名消息的定义是在口信消息定义的基础上增加了如下两条：}\par

\textit{A4. 忠诚将军的签名无法伪造，而且对他签名消息的内容进行任何更改都会被发现；}\par
\textit{A5. 任何人都能验证将军签名的真伪。}\par

\textit{基于签名消息的定义，我们可以知道，签名消息无法被伪造或者篡改。为了深入理解签名消息型解决方案，我们同样以3三将军问题为例进行推导。 图\ref{Byzantine-sig-honest}是忠将率先发起作战协商的场景，General A率先向General B、C发送了进攻消息，一旦叛将General C篡改了来自General A的消息，那么General B将将发现作战信息被General C篡改，General B将执行General A发送的消息。}\par

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{Byzantine-sig-honest.jpeg}
	\caption{指挥官为忠将的情况}
	\label{Byzantine-sig-honest}
\end{figure}
\par

\textit{图\ref{Byzantine-sig-dishonest}是叛将率先发起作战协商的场景，叛将General C率先发送了误导的作战信息，那么General A、B将发现General C发送的作战信息不一致，因此判定其为叛将。可对其进行处理后再进行作战信息协商。签名消息型解决方案可以处理任何数量叛将的场景。}\par

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{Byzantine-sig-dishonest.jpeg}
	\caption{指挥官为忠将的情况}
	\label{Byzantine-sig-dishonest}
\end{figure}
\par

\textit{拜占庭将军问题是为了形象解释计算机分布式处理中的问题而构造出来的故事，但是其很形象的描述了这个问题。将军, 对应计算机节点；忠诚的将军, 对应运行良好的计算机节点；叛变的将军, 被非法控制的计算机节点；信使被杀, 通信故障使得消息丢失；信使被间谍替换, 通信被攻击, 攻击者篡改或伪造信息。如上文所述，拜占庭将军问题提供了对分布式共识问题的一种情景化描述，是分布式系统领域最复杂的模型。此外, 它也为我们理解和分类现有的众多分布式一致性协议和算法提供了框架。现有的分布式一致性协议和算法主要可分为两类：}\par

\textit{一类是故障容错算法(Crash Fault Tolerance, CFT)， 即非拜占庭容错算法，解决的是分布式系统中存在故障，但不存在恶意攻击的场景下的共识问题。也就是说，在该场景下可能存在消息丢失，消息重复，但不存在消息被篡改或伪造的场景。一般用于局域网场景下的分布式系统，如分布式数据库。属于此类的常见算法有
	Paxos算法\footnote{Leslie Lamport. 1998. The part-time parliament. ACM Trans. Comput. Syst. 16, 2 (May 1998), 133–169. DOI:https://doi.org/10.1145/279227.279229}
	、Raft算法\footnote{Heidi Howard,ARC: Analysis of Raft Consensus,Technical Report,University of Cambridge, Computer Laboratory,\url{https://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-857.pdf}}\footnote{\url{https://raft.github.io/}}
	、ZAB( Zookeeper Atomic Broadcast)协议\footnote{F. P. Junqueira, B. C. Reed and M. Serafini, "Zab: High-performance broadcast for primary-backup systems," 2011 IEEE/IFIP 41st International Conference on Dependable Systems \& Networks (DSN), 2011, pp. 245-256, doi: 10.1109/DSN.2011.5958223.}\footnote{F. Junqueira, B. Reed and M. Serafini, "Dissecting Zab" in Tech. Rep. YL-2010–007 12, Sunnyvale, CA, USA:Yahoo!Research,2010.\url{https://cwiki.apache.org/confluence/download/attachments/24193444/yl-2010-007.pdf?version=1&modificationDate=1468443609000&api=v2}}等。
}\par

\textit{一类是拜占庭容错(Byzantine Fault Tolerance)算法，可以解决分布式系统中既存在故障，又存在恶意攻击场景下的共识问题。一般用于互联网场景下的分布式系统，如在数字货币的区块链技术中。属于此类的常见算法有
	PBFT(Practical Byzantine Fault Tolerance)算法
	、PoW(Proof-of-Work)算法\footnote{PoW思想是1993年Cynthia Dwork 和 Moni Naor 文章"Pricing via Processing or Combatting Junk Mail"中首先被提出，首次以PoW名字被提出，出现在文章Jakobsson, M. and A. Juels. “Proofs of Work and Bread Pudding Protocols.” Communications and Multimedia Security (1999).}
	。}\par

\subsubsection{拜占庭共识算法之PBFT}
PBFT是Practical Byzantine Fault Tolerance的缩写，意为实用拜占庭容错算法。该算法是Miguel Castro 和Barbara Liskov在1999年的“操作系统设计与实现国际会议”（OSDI99）上的文章“Practical Byzantine Fault Tolerance”中提出来的，解决了原始拜占庭容错算法效率不高的问题，将算法复杂度由指数级降低到多项式级，使得拜占庭容错算法在实际系统应用中变得可行。

\subsection{挖矿原理\footnotemark}
\footnotetext{比特币原理详解，链接地址\url{https://blog.csdn.net/zcg_741454897/article/details/102796022}}

比特币每个区块的数据结构由区块头和区块体两部分组成。
区块体中包含了矿工搜集的若干交易信息，图\ref{bitcoin-block}中假设有8个交易被收录在区块中，所有的交易生成一颗默克尔树，默克尔树是一种数据结构，它将叶子节点两两哈希，生成上一层节点，上层节点再哈希，生成上一层，直到最后生成一个树根，称之为默克尔树根，只有树根保留在区块头中，这样可以节省区块头的空间，也便于交易的验证。
区块头中包含父区块的哈希，版本号，当前时间戳，难度值，随机数和上面提到的默克尔树根。

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{bitcoin-block.png}
	\caption{比特币区块数据}
	\label{bitcoin-block}
\end{figure}

假设区块链已经链接到了某个块，有ABCD四个节点已经搜集了前十分钟内全网中的一些交易信息，他们选出其中约4k条交易，打包好，生成默克尔树根，将区块头中的信息，即父区块哈希+版本号+时间戳+难度值+随机数+默克尔树根组成一个字符串str，通过两次哈希函数得出一个256的二进制数，即SHA256(SHA256(str)) = 10010011……共256位，比特币要求，生成的结果，前n位必须是0，n就是难度值，如果现在生成的二进制数不符合要求，就必须改变随机数的值，重新计算，只到算出满足条件的结果为止。假设现在n是5，则生成的二进制数必须是00000……(共256位)。一旦挖矿成功，矿工就可以广播这个消息到全网，其他的矿工就会基于该区块继续挖矿。下一个区块头中的父区块哈希值就是上一个区块生成的00000……这个数。
\par
解决这个数学难题要靠运气，理论上，运气最好的矿工可能1次哈希就能算出结果，运气差的可能永远都算不出来。但是总体来看，如果一个矿工的算力越大，单位时间内进行的哈希次数就越多，就越可能在短时间内挖矿成功。
\par
那么n是如何确定的呢？比特币设计者希望，总体上平均每十分钟产生一个区块，总体上来看，挖矿成功的概率为$\frac{1}{2^n}$。现假设世界上有1W台矿机，每台矿机的算力是$14T\text{次}/s=1.4\times 10^{13}\text{次}/s$\footnotemark，单位次/s称之为哈希率，10分钟是600s，所以1W台矿机10分钟可以做$1.4\times 10^{13} \times 6 \times 10^2 \times 10^4= 8.4\times 10^{19}$次哈希运算，从概率角度看，想要挖矿成功需要做$2^n$次运算，可以列出等式$2^n = 8.4 \times 10^{19}$，可以解出n约为66，这个意思就是说，1W台矿机，在10分钟内，可以挖矿成功的难度为66。所以对于这种方法，我们没有办法使得自己的运气变的更好，只能提高自己的算力，尽快的算出结果。
\footnotetext{
	1 kH / s =每秒1,000哈希\\
	1 MH / s =每秒1,000,000次哈希\\
	1 GH / s =每秒1,000,000,000次哈希\\
	1 TH / s =每秒1,000,000,000,000次哈希\\
	1 PH / s =每秒1,000,000,000,000,000次哈希\\
	1 EH / s =每秒1,000,000,000,000,000,000次哈希
}
\par
"当一个矿工算出了合适的随机数，并且没有收到其他矿工算出来的通知时，他就可以认为自己首先找到了随机数（当然有时候可能是网络延迟他没有收到通知）。于是他要做的就是向全网广播，告诉大家他算出的随机数以及他这个包的数据。其他矿工收到这个消息后，如果这个时间段没有更早的消息，他们会验证这个随机数，以及这个包里的数据是否合法。验证通过的话，矿工们会接受这就是这个时间段的最终挖出区块，他们会把这个区块添加到自己的账本的末端，跟原来的账本chain在一起，并且停掉之前的计算随机数的进程，把自己那个包里包含的但未包含在新区块里的交易数据重新放到待打包交易池中，然后进行下一轮的挖矿。\footnote{完整讲清比特币（三）：挖矿和记账,链接地址\url{https://zhuanlan.zhihu.com/p/34413557}}"

\subsection{钱包}
比特币的底层技术是公钥体系，比特币钱包就是包含私钥和地址，比特币的公钥体系用的是椭圆曲线密码(ECC)，ECC的公私钥生成可以查看相关文献，地址是这个钱包的唯一标识，我们简单介绍一下地址的生成\footnote{如何生成比特币地址和私钥？,链接地址\url{https://zhuanlan.zhihu.com/p/54296648}}：
\begin{enumerate}
	\item 计算公钥摘要。这里公钥既可以是完整版，也可以是压缩版，我们选择压缩版。有了公钥之后，对公钥进行两次哈希运算，第一次通过 SHA-256 算法得到运算结果后，对结果再进行一次 RIPEMD-160 运算，最终得到的结果就是所谓的加密版的公钥了，比如：\\
	453233600a96384bb8d73d400984117ac84d7e8b。
	
	\item 对加密版公钥添加网络标识字节。比特币一共有两个网络：主网和测试网。如果我们需要生成一个主网地址，就要在加密版公钥开头添加 0x00，比如：\\ 00453233600a96384bb8d73d400984117ac84d7e8b。
	
	\item 添加校验值。校验值是通过对第二步得到的结果运行两次 SHA-256 哈希运算，然后取最终哈希值的前四个字节得到的，例如：表示成十六机制就是 512f43c4。把这个校验值添加到第二步结果的末尾，得到的就是钱包地址了，比如：\\
	 00453233600a96384bb8d73d400984117ac84d7e8b\underline{512f43c4}\\
	 有了校验值，钱包软件就很容易帮我们判定地址有没有填错或者损坏了。	
	但是，很多时候我们看到的钱包地址不是用十六进制表示的，而是用 Base58\footnote{Base58编码的作用是将非可视字符可视化,或者说ASCII化。与Base64不同的是base58编码去掉了几个看起来会产生歧义的字符，如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ，和几个影响双击选择的字符，如/, +。结果字符集正好58个字符(包括9个数字，24个大写字母，25个小写字母)。}格式，所以最终钱包地址看起来是这个样子：\\
	17JsmEygbbEUEpvt4PFtYaTeSqfb9ki1F1。
		
\end{enumerate}
关于较详细的介绍，可以查看Bitcoin WIKI (链接为：\url{https://en.bitcoin.it/wiki/Invoice_address}).


\section{比特币}


从比特币的本质说起，比特币的本质其实就是一堆复杂算法所生成的特解。特解是指方程组所能得到有限个解中的一组。而每一个特解都能解开方程并且是唯一的。以钞票来比喻的话，比特币就是钞票的冠字号码，你知道了某张钞票上的冠字号码，你就拥有了这张钞票。而挖矿的过程就是通过庞大的计算量不断的去寻求这个方程组的特解，这个方程组被设计成了只有 2100 万个特解，所以比特币的上限就是 2100 万个。 [5] 
要挖掘比特币可以下载专用的比特币运算工具，然后注册各种合作网站，把注册来的用户名和密码填入计算程序中，再点击运算就正式开始。完成Bitcoin客户端安装后，可以直接获得一个Bitcoin地址，当别人付钱的时候，只需要自己把地址贴给别人，就能通过同样的客户端进行付款。在安装好比特币客户端后，它将会分配一个私钥和一个公钥。需要备份你包含私钥的钱包数据，才能保证财产不丢失。如果不幸完全格式化硬盘，个人的比特币将会完全丢失。
\footnote{\url{https://baike.baidu.com/item/区块链}} \par

可以说比特币的整个实现就是建立在已有的甚至存在多年的计算机科学领域里的技术或概念的整合，其中哈希算法在比特币中的应用几乎是方方面面，主要包括SHA256和RIPEMD160，比特币将这两个哈希算法的应用组合成两个函数：hash256(d)=sha256(sha256(d))和hash160(d)=ripemd160(sha256(d))，其中d为待哈希的字节数组，两者分别生成256位（32字节）和160位（20字节）的16进制数值。hash256主要用于生成标志符，如区块ID，交易ID等，而hash160主要用于生成比特币地址。

对于hash160比较认同的答案是ripemd160可以使得生成的地址更短，但是只做ripemd160一次哈希可能会存在安全漏洞所以同时使用sha256起到安全加固；至于hash256使用两次sha256哈希算法的原因来源于sha1算法，由于一次sha1哈希存在被生日攻击（birthday attack）的风险，所以当使用sha1运算时一种有效方式就是做两次sha1哈希，sha256本身并不存在生日攻击漏洞，但是防御性的使用两次sha256哈希借鉴于sha1.\footnote{\url{https://zhuanlan.zhihu.com/p/31961153}}

\section{其他数字货币或虚拟货币}
比特币是中本聪在2009年设计开发，以开源的方式发布，并在此软件的基础上构建P2P网络，形成的一种P2P形式的虚拟货币。\par
后来又有很多采用相同思想发布的虚拟货币，下面两张图(图\ref{baidu-virtual-cash-list}, 图\ref{BTC123-virtual-cash-list})是用搜索引擎获得两个页面，以此来说明现在已经出现了很多了类似于比特币的虚拟货币，严格意义上来讲，比特币应该是指中本聪发起的虚拟货币，但是现在很多场合比特币成为了虚拟货币或者数字货币的代名词，但这种替换应该以不引起歧义为前提。

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{baidu-virtual-cash-list.png}
	\caption{百度百科上的数字货币\footnote{\url{https://baike.baidu.com/item/比特币}}}
	\label{baidu-virtual-cash-list}
\end{figure}

\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.7\textwidth]{BTC123-virtual-cash-list.png}
	\caption{BTC123网站上列出的数字货币(部分)\footnote{\url{https://www.btc123.com/currency/}}}
	\label{BTC123-virtual-cash-list}
\end{figure}


\section{区块链(block chains)}
通常人们都认为区块链是和比特币的概念一起提出的，但是阅读中本聪的原始论文你会发现，论文中根本没有提及“区块链”这个概念，而是后来大家用来指代与比特币及其账本类似系统的一个宽泛术语。\par
我国于2016年10月18号，在北京成立“中国区块链技术和产业发展论坛”\footnote{论坛网址\url{http://www.cbdforum.cn/bcweb/}}，论坛由中国电子技术标准化研究院、蚂蚁金服、万向、微众银行、平安集团、乐视联服、万达网络、用友、三一集团、海航科技等国内从事区块链的重点企事业单位构成。该论坛一个主要工作是编写区块链的相关标准，其于2017年5月16日，发布首个区块链标准《区块链 参考架构》，其对区块链的概念定义链为：
\begin{enumerate}
	\item 区块链(blockchain):一种在\textbf{对等网络}环境下，通过透明和可信规则，构建不可伪造、不可篡改和可追溯的\textbf{块链式数据结构}，实现和管理事务处理的模式。(注：事务处理包括但不限于可信数据的产生、存取和使用等。)
	\item 对等网络(peer-to-peer network):一种仅包含对控制和操作能力等效的节点的计算机网络。[GB/T 5271.18-2008]
	\item 块链式数据结构(chained-block data structure):一段时间内发生的事务处理以区块为单位进行存储，并以密码学算法将区块按时间顺序连接成链条的一种数据结构。
\end{enumerate}

NIST对Blockchain的定义或者说简要描述为\footnote{此信息来源于\url{https://www.nist.gov/topics/blockchain}}:\par
Blockchain represents a new paradigm for digital interactions and serves as the underlying technology for most cryptocurrencies.\par  
A blockchain is a collaborative, tamper-resistant ledger that maintains transactional records. The transactional records (data) are grouped into blocks. A block is connected to the previous one by including a unique identifier that is based on the previous block’s data. As a result, if the data is changed in one block, it’s unique identifier changes, which can be seen in every subsequent block (providing tamper evidence). This domino effect allows all users within the blockchain to know if a previous block’s data has been tampered with. Since a blockchain network is difficult to alter or destroy, it provides a resilient method of collaborative record keeping.\par
NIST researchers have been investigating blockchain technologies at multiple levels: from use cases, applications and existing services, to protocols, security guarantees, and cryptographic mechanisms. Research outcomes include scientific papers and the production of software for experimentation as well as providing direction for other NIST endeavors in this space. Blockchain has the potential to be implemented in many different systems, to include manufacturing supply chains, data registries, digital identification, and records management. \par
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.9\textwidth]{nist-blockchain.png}
	\caption{NIST区块链示意图}
	\label{nist-blockchain}
\end{figure}

虽然区块链的概念产生晚于比特币，但是由于其应用场景更加宽泛，所以比特币反而成了区块链的一种应用，或者是区块链技术在特定场景下的具体应用。

\subsection{区块链的几种类型}
区块链按照准入机制，可以分为公有链（Public  Blockchain）、私有链 (Private blockchain)和联盟链（Consortium  Blockchain）三类。
\par
\vspace{1cm}
\textit{A public blockchain is permissionless. Anyone can join the network and read, write, or participate within the blockchain. A public blockchain is decentralized and does not have a single entity which controls the network. Data on a public blockchain are secure as it is not possible to modify or alter data once they have been validated on the blockchain. Bitcoin and Ethereum are well-known examples of a public blockchain.}\footnote{PUBLIC VS. PRIVATE BLOCKCHAIN : A COMPREHENSIVE COMPARISON,web link:\url{https://www.blockchain-council.org/blockchain/public-vs-private-blockchain-a-comprehensive-comparison/}} \par

\vspace{1cm}
\textit{A private blockchain is a permissioned blockchain. Private blockchains work based on access controls which restrict the people who can participate in the network. There are one or more entities which control the network and this leads to reliance on third-parties to transact. In a private blockchain, only the entities participating in a transaction will have knowledge about it, whereas the others will not be able to access it. Hyperledger Fabric of Linux Foundation is a perfect example of a private blockchain.}\footnote{PUBLIC VS. PRIVATE BLOCKCHAIN : A COMPREHENSIVE COMPARISON,web link:\url{https://www.blockchain-council.org/blockchain/public-vs-private-blockchain-a-comprehensive-comparison/}}\par

\vspace{1cm}
\textit{Consortium blockchains do not allow any person with an internet connection to participate nor do they grant full control to a single entity but rather a group of approved individuals. They therefore provide the  efficiency and security of public blockchains while still allowing for some degree of central control, monitoring and safeguarding. Consortium blockchains are most often the banking sector, for instance Quorum is an Ethereum-powered consortium blockchain created by JP Morgan to service the needs of financial industries and beyond. Another example, Hyperledger, open source collaborative effort that unites finance, banking, Internet of Things, supply chains, manufacturing and Technology on a consortium blockchain.}\footnote{What Are Consortium Blockchains?,web link: \url{https://blockchainlabs.asia/news/what-are-consortium-blockchains/}}
\par
\vspace{1cm}

不同类型的区块链其节点之间的信任程度不同，所以其采用了不同的共识算法，\textit{公链中的节点可以很自由的加入或者退出，不需要严格的验证和审核，所以公链不仅需要考虑网络中存在故障节点，还需要考虑作恶节点，公链使用的共识算法有PoW、POS、DPOS、Ripple等。私链的适用环境一般是不考虑集群中存在作恶节点，只考虑因为系统或者网络原因导致的故障节点，私链的共识算法有Paxos、Raft。联盟链中每个新加入的节点都是需要验证和审核的，联盟链的适用环境除了需要考虑集群中存在故障节点，还需要考虑集群中存在作恶节点，联盟链的共识算法有PBFT、DBFT。}\footnote{深入剖析区块链的共识算法 Raft \& PBFT,网络链接\url{https://www.cnblogs.com/davidwang456/articles/9001331.html}}
\par

有时我们还能看到一个概念，侧链（Side Chain），侧链不是一种区块链类型，而是一种协议“\textit{这个协议具体是：可以让比特币安全地从比特币主链转移到其他区块链，又可以从其他区块链安全地返回比特币主链的一种协议。侧链技术为什么会出现？简单来讲，在比特币、以太坊等公链上做创新或拓展是比较困难的。同时，公链每秒处理交易笔数有限，比如，以太坊25tps，比特币7tps，并且在交易用户过多时会发生拥堵，甚至瘫痪。这时，侧链技术应运而生。侧链就像是一条条通路，将不同的区块链互相连接在一起，以实现区块链的扩展。公链本身是一本分布式账本，侧链是独立于公链的另一本分布式账本。但是这两个账本之间能够“互相操作”，实现交互。}”\footnote{公有链、联盟链、私有链，一文让你读懂“眼花缭乱”的各种链,文章链接\url{https://www.sohu.com/a/250564024_99949057}}\par


\section{开源系统}

Bitcoincore(\url{https://bitcoincore.org/})是一个开源比特币软件，网站简单介绍为"Bitcoin Core is an open source project which maintains and releases Bitcoin client software called “Bitcoin Core”.
It is a direct descendant of the original Bitcoin software client released by Satoshi Nakamoto after he published the famous Bitcoin whitepaper.
Bitcoin Core consists of both “full-node” software for fully validating the blockchain as well as a bitcoin wallet. The project also currently maintains related software such as the cryptography library libsecp256k1 and others located at GitHub.
Anyone can contribute to Bitcoin Core.",Github上的仓库地址为\url{https://github.com/bitcoin/bitcoin}，Gitee上的镜像地址为\url{https://gitee.com/mirrors/bitcoin}。
\par

还有一些其他的开源项目比如加密钱包(例如Tor-Crypto-Wallet)、交易平台(比如CCXT – CryptoCurrency eXchange Trading Library、Gryphon)等。
\par

RChain是一个开源的区块链项目，Github上仓库地址为\url{https://github.com/rchain/rchain}，RChain项目的README中的简介为"The open-source RChain project is building a decentralized, economic, censorship-resistant, public compute infrastructure and blockchain. It will host and execute programs popularly referred to as “smart contracts”. It will be trustworthy, scalable, concurrent, with proof-of-stake consensus and content delivery."。
\par